package data
{
	import flash.net.URLRequestMethod;
	import flash.net.URLVariables;
	import flash.utils.ByteArray;
	
	public class DataPack
	{
		/**
		 * 数据包(Object)
		 */
		private var _data:Object=new Object();
		
		/**
		 * 数据包(ByteArray)
		 */
		private var _dataByteArray:ByteArray=new ByteArray();
		
		/**
		 * 数据包(Object)
		 */
		private var _dataRequest:URLVariables=new URLVariables();
		
		/**
		 *数据包传输方式 
		 */		
		private var _dataTransferType:int;
		
		/**
		 *数据包根级编号 
		 */		
		private var _rootPackCode:int;
		
		/**
		 *数据包子级编号 
		 */		
		private var _packCode:int;
		
		/**
		 *Request请求地址 
		 */		
		private var _requestUrl:String;
		
		/**
		 *Request请求方式 
		 */		
		private var _requestMethodType:String;		
		
		/**
		 * 数据包
		 * @param rootPackCode 数据包根编号
		 * @param packCode 数据包编号
		 */
		public function DataPack(rootPackCode:int=0, packCode:int=0, dataTransferType:int=DataTransferType.SOCKET_BYTE_ARRAY, requestUrl:String=null, requestMethodType:String=URLRequestMethod.GET)
		{
			_rootPackCode=rootPackCode;
			_packCode=packCode;
			_dataTransferType=dataTransferType;
			_requestUrl=requestUrl;
			_requestMethodType=requestMethodType;
			
			if(dataTransferType==DataTransferType.SOCKET_BYTE_ARRAY)
			{
				_dataByteArray.position=0;
			}
			
			add("dataTransferType", dataTransferType, DataType.INT);//数据通讯类型
			add("rootPackCode", rootPackCode, DataType.INT);//加入数据包根级编号
			add("packCode", packCode, DataType.INT);//加入数据包子级编号
		}
		
		/**
		 *增加数据项  
		 * @param key 数据标识Key
		 * @param value 数据值
		 */
		public function add(key:String, value:*, dataType:String):void
		{
			switch(_dataTransferType)
			{
				case DataTransferType.SOCKET_AMF3:
					_data[key]=value;
					break;
				case DataTransferType.SOCKET_BYTE_ARRAY:
					AddByteArray(value, dataType);
					break;
				case DataTransferType.REQUEST:
					_dataRequest[key]=value;
					break;
			}
		}
		
		/**
		 *ByteArray方式增加数据 
		 */		
		private function AddByteArray(value:*, dataType:String):void
		{
			switch(dataType)
			{
				case DataType.UTF:
					_dataByteArray.writeUTF(value);
					break;
				case DataType.INT:
					_dataByteArray.writeInt(value);
					break;
				case DataType.BOOLEAN:
					_dataByteArray.writeBoolean(value);
					break;
				case DataType.DOUBLE:
					_dataByteArray.writeDouble(value);
					break;
				case DataType.FLOAT:
					_dataByteArray.writeFloat(value);
					break;
				case DataType.BYTE:
					_dataByteArray.writeByte(value);
					break;
				case DataType.BYTES:
					_dataByteArray.writeBytes(value);
					break;
				case DataType.SHORT:
					_dataByteArray.writeShort(value);
					break;
				case DataType.UNSIGNED_INT:
					_dataByteArray.writeUnsignedInt(value);
					break;
				case DataType.UTF_BYTES:
					_dataByteArray.writeUTFBytes(value);
					break;
				case DataType.OBJECT:
					_dataByteArray.writeObject(value);
					break;
			}
		}
		
		/**
		 * 数据包
		 */
		public function get data():Object
		{
			switch(_dataTransferType)
			{
				case DataTransferType.SOCKET_AMF3:
					return _data;
					break;
				case DataTransferType.SOCKET_BYTE_ARRAY:
					return _dataByteArray;
					break;
				case DataTransferType.REQUEST:
					return _dataRequest;
					break;
			}
			
			return null;
		}
		
		/**
		 * 数据包
		 */
		public function set data(value:Object):void
		{
			_data=value;
		}
		
		/**
		 *数据包传输方式 
		 */
		public function get dataTransferType():int
		{
			return _dataTransferType;
		}

		/**
		 *数据包根级编号 
		 */
		public function get rootPackCode():int
		{
			return _rootPackCode;
		}

		/**
		 * 数据包子级编号 
		 */
		public function get packCode():int
		{
			return _packCode;
		}
		
		/**
		 * Request请求地址
		 */
		public function get requestUrl():String
		{
			return _requestUrl;
		}
		
		/**
		 * Request请求方式
		 */
		public function get requestMethodType():String
		{
			return _requestMethodType;
		}		
	}
}